#include "STC8A8K64D4.h"
#include <intrins.h>
#include "oled.h"
#include "bmp.h"
#include "LED4BITMODULE.H"

extern unsigned char LEDBUF[4];

sbit LED1=P0^1;
sbit LED2=P0^2;
sbit BUZZER=P0^3;
#define pSMD_DIG P2 //SMD数码管接口，共阴数码管
unsigned char code p1SMDDigFontTable[]={  //共阴a~g对应io的7~1位
0xFC,
0x60,
0xda,
0xf2,
0x66,
0xb6,
0xbe,
0xe0,
0xfe,
0xf6,
0x00 //灭
};
void Delay10ms()		//@11.0592MHz
{
	unsigned char i, j;
	i = 18;
	j = 5;
	do
	{
		while (--j);
	} while (--i);
}
  
void Delay500ms(void)	//@11.0592MHz
{
	unsigned char data i, j, k;

	_nop_();
	i = 4;
	j = 129;
	k = 119;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void Timer0Init(void)		//100微秒@11.0592MHz
{
	 
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0xA4;		//设置定时初始值
	TH0 = 0xFF;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0 = 1;
	EA=1;
}

//void Timer0Init(void)		//100微秒@11.0592MHz
//{
//	AUXR |= 0x80;		//定时器时钟1T模式
//	TMOD &= 0xF0;		//设置定时器模式
//	TL0 = 0xAE;		//设置定时初始值
//	TH0 = 0xFB;		//设置定时初始值
//	TF0 = 0;		//清除TF0标志
//	TR0 = 1;		//定时器0开始计时
//}

//==================================================================
//函 数 名：GetDisPlayValue(int value)
//功能描述：将4位数字拆分，如果超过4位，则显示----
//输入参数：小于9999的四位数据
//返 回 值：无
//==================================================================

void GetDisPlayValue(int value)
{
	if(value>0 && value<10000)
	{
		LEDBUF[0]=value/1000;			if(LEDBUF[0]==0)LEDBUF[0]=OFFbit;
		LEDBUF[1]=value%1000/100;	if(LEDBUF[0]==OFFbit && LEDBUF[1]==0)LEDBUF[1]=OFFbit;
		LEDBUF[2]=value%100/10;		if(LEDBUF[1]==OFFbit && LEDBUF[0]==0)LEDBUF[2]=OFFbit;
		LEDBUF[3]=value%10;
	}
	else 
	{
		LEDBUF[0]=BarBit;LEDBUF[1]=BarBit;LEDBUF[2]=BarBit;LEDBUF[3]=BarBit;
	}
}
	

void InitGPIO()
{
	  P0M0 = 0x00;                                //设置P0.0~P0.7为双向口模式
    P0M1 = 0x00;
		P1M0 = 0x00;                                //设置P1.0~P1.7为双向口模式
    P1M1 = 0x00;
		P2M0 = 0x00;                                //设置P2.0~P2.7为双向口模式
    P2M1 = 0x00;
		P3M0 = 0x00;                                //设置P3.0~P3.7为双向口模式
    P3M1 = 0x00;
		 
}
//SMD LED驱动例程
void main_SMDLED()
{
	unsigned char dis=0,i=0;
	int j;
	InitGPIO();pSMD_DIG=0;
	while(1)
	{
		pSMD_DIG=~p1SMDDigFontTable[i];
		LED1=0;	LED2=0;BUZZER=0;	
		for(j=0;j<200;j++)Delay10ms();
		LED1=1;	LED2=1;BUZZER=1;	
		for(j=0;j<200;j++)Delay10ms();
		if(++i>9){i=0;pSMD_DIG=0;for(j=0;j<400;j++)Delay10ms();}
	}
}

//==================================================================
//函 数 名：void main(void)
//功能描述：四位一体数码管驱动例程主函数
//输入参数：无
//返 回 值：无
//==================================================================

void main()
{
	unsigned int i=0,j=0;
	unsigned int disp=1080;
	InitGPIO();//初始化GPIO工作模式
	GetDisPlayValue(disp);//数码管显示初值
	while(1)
	{	
			j++;
			if(j==500){LEDModule_LEDON(0);LEDModule_BeepON(1);disp+=11;if(disp>9000)disp=88;GetDisPlayValue(disp);}
			else if(j==1000){LEDModule_LEDON(1);j=0;LEDModule_BeepON(0);}
			LEDModule_Sendat(i,LEDBUF[i],-1);//通过变量i控制第i位数码管显示的内容
			if(++i==4)i=0;//i取值范围0-3
	}
}

//OLED驱动例程
int main_OLED(void)
{	
	unsigned int t=' ';
	InitGPIO();
	GetDisPlayValue(1);LEDModule_BeepON(0);LEDModule_Sendat(0,LEDBUF[0],-1);
	OLED_Init();//初始化OLED 
	OLED_ColorTurn(0);//0正常显示，1 反色显示
  OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示	
	OLED_DrawBMP(32,0,64, 64,BMP1); 
	
	while(1) 
	{	
		t=t+13;
		if(t>'~')t=' ';
		OLED_ShowNum(63,6,t,3,16);
		//delay_ms(1);
		//OLED_Clear();
	}	  
	
}

//********此功能主要是实现不需要给目标芯片重新上电就可以下载程序
//连续接收到6个0x5a,复位ISP，启动下载	
void Is_SysISP_Reset(unsigned char ReseCode)
{
	static unsigned char SoftResetCNT=0; 
	if(ReseCode==0x5a)
	{  
		if(++SoftResetCNT==6){
			SoftResetCNT=0;				
			IAP_CONTR=0x60;        	
		}					
	}
	else SoftResetCNT=0;		
}


void tm0_isr() interrupt 1
{	
	static int dis=0;
	static  unsigned char i=0,j=0;	
	if(++i==4)i=0;
}